/* 
 * $RCSfile$
 */

#ifndef __ADP_H__
#define __ADP_H__

#define	FRQ_32	(0 << 2)
#define	FRQ_16	(1 << 2)
#define	FRQ_8	(2 << 2)
#define	FRQ_4	(3 << 2)

/* for standard */
#define FREQ_32	(0x7af0)	/* 32k Hz */
#define FREQ_16	(0x3d78)	/* 16k Hz */
#define FREQ_8	(0x1ebc)	/*  8k Hz */
#define FREQ_4	(0x0f5e)	/*  4k Hz */
/* for 262 line */
#define FREQ2_32     0x7ad0            /* 32k Hz */
#define FREQ2_16     0x3d68            /* 16k Hz */
#define FREQ2_8      0x1eb4            /*  8k Hz */
#define FREQ2_4      0x0f5a            /*  4k Hz */
/* for 263 line */
#define FREQ3_32     0x7b48            /* 32k Hz */
#define FREQ3_16     0x3da4            /* 16k Hz */
#define FREQ3_8      0x1ed2            /*  8k Hz */
#define FREQ3_4      0x0f69            /*  4k Hz */


#define PCM_PLAYING	(1)	/* 再生中 */
#define PCM_STOPPING	(0)	/* 停止 */
#define PCM_LOOP	(1)	/* リングバッファ */
#define PCM_NORMAL	(0)	/* シーケンシャルバッファ */

#define MAX_PCM_VOLUME  (0x3e)  /* ＰＣＭの最大音量 */
#define MIN_PCM_VOLUME  (0x10)  /* ＰＣＭの無音時音量 */

enum CHANNEL { 
  CHANNEL_1 = 1,		/* チャンネル１ */
  CHANNEL_2,			/* チャンネル２ */
  CHANNEL_ALL,			/* 両チャンネル */
};

#define PCM_ADDRESS	(0x40000) /* ADPCM データ格納先頭アドレス(KRAM内) */

/* ADPCM ファイル(.adp) ヘッダ情報 */
typedef struct pcmheader_t {
  unsigned long fileid;
  unsigned long filesize;
  unsigned long format_type;
  struct {
    unsigned long fileid;
    unsigned long formatsize;
    struct {
      unsigned short format_type;
      unsigned short channel_number;
      unsigned long rate;
      unsigned long bps;	/* 1秒あたりの転送バイト数 */
      unsigned short sample;	/* サンプル数 */
      unsigned short bit;	/* 量子化ビット */
    } type;
    unsigned long dataid;
    unsigned long datasize;
  } info;
} ADPCMHEADER;

/* ADPCM 操作用構造体 */
struct PCMINFO {
  unsigned short wStartAddress;	/* 開始アドレス */
  unsigned long lEndAddress;	/* 終了アドレス */
  char nBufferMode;		/* バッファモード */
  unsigned short wSamplingRate;	/* サンプリングレート */
};

/* プロトタイプ宣言 */

short AdpcmStatus( void );
void AdpcmInit( void );
int AdpcmVolume(short sChannel, short sLeftVolume, short sRightVolume);
unsigned short AdpcmDataSet(struct PCMINFO *pInfo,unsigned short *pPcmData, unsigned short usPcmBlock, int nMode);
int AdpcmPlay(short sChannel, struct PCMINFO *pInfo);
void AdpcmStop(short sChannel);
void AdpcmWait(short sChannel);

#endif /* __ADP_H__ */
